/**
 * Map 结构：由于对象的属性只能接受字符串类型，所有产生了Map结构，优化对象结构
 * 
 * 方法： 返回值是Map实例可以连缀
 * 
 * set(key,val) 加元素
 * get(key)     取元素
 * has(key)     判断是否包含元素   boolean
 * clear()      删除所有数据
 * 
 * 使用 new Map() 实例化
 */

//1.添加数据 set() 
var map = new Map();
map.set('name', 'jack').set('age', 22).set(0, 100);
console.log(map); // Map { 'name' => 'jack', 'age' => 22, 0 => 100 }

//2.获取数据 get()
console.log(map.get(0)); //100 
console.log(map.get('name')); //Jack

//3.判断存在数据 has()
console.log(map.has(0)); //ture

//4.删除数据 delete()
map.delete(0);
console.log(map) //Map { 'name' => 'jack', 'age' => 22 }

// 5.清空数据 clear()
map.clear();
console.log(map); //Map(0) {}

/**
 * Map结构规则
 */

//1. map 支持数组作为构造函数的参数，但必须是二维数组

let arr = [
    ['name', 'jack'],
    ['age', 23]
];

let map1 = new Map(arr);
console.log(map1); //Map { 'name' => 'jack', 'age' => 23 }

//2. key不能重复，val可以重复，key如果重复会将原来的值覆盖
map1.set('name', 'tom');
map1.set('hob', 'sing');
console.log(map1); //Map { 'name' => 'tom', 'age' => 23, 'hob' => 'sing' }

/**
 * Map的遍历
 */

//1. let of 遍历 map
for (const i of map1) {
    console.log(i);
}

//2. foreach 遍历map
map1.forEach((v, k) => {
    console.log(k, v);
})

//3. let of 遍历map.keys
for (let k of map1.keys()) {
    console.log(k, map1.get(k));
}
console.log('=======================')
//4. let of 遍历map.values
for (let v of map1.values()) {
    console.log(v)
}
console.log('=======================')
//5. let of 遍历map.entries
for (const i of map1.entries()) {
    console.log(i[0], i[1]);
}
console.log('=======================')
//6. let of 遍历 map.entries + 解构
for (let [k, v] of map1.entries()) {
    console.log(k, v);
}